﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Noris.Schedule.Support.Services;

namespace Noris.Schedule.Planning.ProcessData
{
	#region INTERFACE IPlanVariator : PŘEDPIS PRO PLUGINY, KTERÉ TVOŘÍ VARIANTY PLÁNOVACÍHO PROCESU
    /// <summary>
    /// Předpis pro třídy, které chtějí hrát roli varianty plánovacího procesu (variátory).
    /// Variátory typicky dědí od Noris.Schedule.Planning.ProcessData.PlanVariatorCplForward (nebo PlanVariatorCplBackward).
    /// Mohou ale být postaveny i na zelené louce.
    /// Variátory se nabízejí uživateli v toolbaru, systém je vyhledává jako jiné pluginy (interface IPlanVariator je potomkem IPlugin).
    /// </summary>
    public interface IPlanVariator : IPlugin, IDisposable
    {
		/// <summary>
		/// Pořadí této varianty plánu v nabídce v toolbaru. Standardní varianty, dodávané LCS, mají hodnoty 100-199.
		/// </summary>
        int Order { get; }
		/// <summary>
		/// Název této varianty plánu, který se zobrazuje v toolbaru v nabídce (combo box)
		/// </summary>
        string Name { get; }
		/// <summary>
		/// Rozšířený popis této varianty plánu, který se zobrazuje v toolbaru v bublině (ToolTip)
		/// </summary>
        string Description { get; }
		/// <summary>
		/// Metoda, která má za úkol setřídit seznam návrhů na výrobu do takového pořadí, ve kterém se budou poté registrovat do kapacitních úkolů.
		/// Seznam je předáván v args.AxisSPairList.
		/// Výchozí komparátory jsou k dispozici na třídě PlanningAxisSchedulePair jako statické metody CompareToFuture() / CompareToHistory().
		/// Je možno vytvořit i jiný komparátor. 
		/// Teoreticky je možné odebrat některé položky, pak nebudou naplánovány jejich kapacity.
		/// </summary>
		/// <param name="args">Data pro tuto metodu: seznam návrhů k setřídění a reference na plánovací proces</param>
		void PrepareAxisSListToScheduling(PlanVariatorAxisSListArgs args);
	}
	#endregion
	#region CLASS PlanVariatorAxisSListArgs : ARGUMENT VARIÁTORU, KTERÝ PŘEDÁVÁ SEZNAM NÁVRHŮ Z OSY S DO PLÁNOVÁNÍ KAPACIT.
	/// <summary>
	/// PlanVariatorAxisSListArgs : argument variátoru, který předává seznam návrhů z osy S do systému plánování kapacit.
	/// </summary>
	public class PlanVariatorAxisSListArgs : PlanVariatorArgs
	{
		internal PlanVariatorAxisSListArgs(PlanningDataCls planningProcess, List<PlanningAxisSchedulePair> axisSPairList)
			: base(planningProcess)
		{
			this.AxisSPairList = axisSPairList;
		}
		/// <summary>
		/// Seznam požadavků na zaplánování kapacit.
		/// Jde o návrhy na příjem z výroby na osu S, které vyplynuly z balancování zásoby na skladových kartách, 
		/// přižemž bylo určeno, že jejich zajištění bude provedeno výrobou.
		/// </summary>
		public List<PlanningAxisSchedulePair> AxisSPairList { get; private set; }
	}
	#endregion

	#region CLASS PlanVariatorArgs : ZÁKLADNÍ TŘÍDA PRO ARGUMENTY VARIÁTORU PLÁNOVACÍHO PROCESU
	/// <summary>
	/// PlanVariatorArgs : základní třída všech argumentů, předávaných do variátoru.
	/// </summary>
	public class PlanVariatorArgs
	{
		internal PlanVariatorArgs(PlanningDataCls planningProcess)
		{
			this.PlanningProcess = planningProcess;
		}
		/// <summary>
		/// Reference na plánovací proces, umožní pracovat s daty procesu do větší hloubky.
		/// </summary>
		public PlanningDataCls PlanningProcess { get; private set; }
	}
	#endregion

}
